package com.system.cacheCenterBackend.service.cacheService;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 缓存服务接口，定义CRUD操作
 */
public interface RedisCacheService {

    /**
     * 设置缓存值
     *
     * @param key   键
     * @param value 值
     * @return 是否设置成功
     */
    boolean set(String key, String value);

    /**
     * 设置缓存值，带过期时间
     *
     * @param key     键
     * @param value   值
     * @param timeout 过期时间（秒）
     * @return 是否设置成功
     */
    boolean set(String key, String value, long timeout);

    /**
     * 获取缓存值
     *
     * @param key 键
     * @return 值
     */
    String get(String key);

    /**
     * 删除缓存值
     *
     * @param key 键
     * @return 是否删除成功
     */
    boolean delete(String key);

    /**
     * 检查缓存键是否存在
     *
     * @param key 键
     * @return 是否存在
     */
    boolean exists(String key);

    // ==================== List 操作 ====================

    /**
     * 向列表左侧添加元素
     *
     * @param key   键
     * @param value 值
     * @return 添加后列表长度
     */
    Long leftPush(String key, String value);

    /**
     * 向列表右侧添加元素
     *
     * @param key   键
     * @param value 值
     * @return 添加后列表长度
     */
    Long rightPush(String key, String value);

    /**
     * 从列表左侧弹出元素
     *
     * @param key 键
     * @return 弹出的元素
     */
    String leftPop(String key);

    /**
     * 从列表右侧弹出元素
     *
     * @param key 键
     * @return 弹出的元素
     */
    String rightPop(String key);

    /**
     * 获取列表指定范围的元素
     *
     * @param key   键
     * @param start 开始索引
     * @param end   结束索引
     * @return 元素列表
     */
    List<String> listRange(String key, long start, long end);

    /**
     * 获取列表长度
     *
     * @param key 键
     * @return 列表长度
     */
    Long listSize(String key);

    // ==================== Set 操作 ====================

    /**
     * 向集合添加元素
     *
     * @param key    键
     * @param values 值
     * @return 添加成功的元素数量
     */
    Long setAdd(String key, String... values);

    /**
     * 从集合移除元素
     *
     * @param key    键
     * @param values 值
     * @return 移除成功的元素数量
     */
    Long setRemove(String key, String... values);

    /**
     * 获取集合所有元素
     *
     * @param key 键
     * @return 集合元素
     */
    Set<String> setMembers(String key);

    /**
     * 检查元素是否在集合中
     *
     * @param key   键
     * @param value 值
     * @return 是否存在
     */
    Boolean setIsMember(String key, String value);

    /**
     * 获取集合大小
     *
     * @param key 键
     * @return 集合大小
     */
    Long setSize(String key);

    // ==================== Hash 操作 ====================

    /**
     * 设置哈希字段值
     *
     * @param key   键
     * @param field 字段
     * @param value 值
     */
    void hashPut(String key, String field, String value);

    /**
     * 获取哈希字段值
     *
     * @param key   键
     * @param field 字段
     * @return 值
     */
    String hashGet(String key, String field);

    /**
     * 删除哈希字段
     *
     * @param key    键
     * @param fields 字段
     * @return 删除成功的字段数量
     */
    Long hashDelete(String key, String... fields);

    /**
     * 获取哈希所有字段和值
     *
     * @param key 键
     * @return 字段值映射
     */
    Map<String, String> hashGetAll(String key);

    /**
     * 检查哈希字段是否存在
     *
     * @param key   键
     * @param field 字段
     * @return 是否存在
     */
    Boolean hashExists(String key, String field);

    /**
     * 获取哈希字段数量
     *
     * @param key 键
     * @return 字段数量
     */
    Long hashSize(String key);

    // ==================== ZSet 操作 ====================

    /**
     * 向有序集合添加元素
     *
     * @param key   键
     * @param value 值
     * @param score 分数
     * @return 是否添加成功
     */
    Boolean zsetAdd(String key, String value, double score);

    /**
     * 从有序集合移除元素
     *
     * @param key    键
     * @param values 值
     * @return 移除成功的元素数量
     */
    Long zsetRemove(String key, String... values);

    /**
     * 获取有序集合指定范围的元素（按分数排序）
     *
     * @param key   键
     * @param start 开始索引
     * @param end   结束索引
     * @return 元素集合
     */
    Set<String> zsetRange(String key, long start, long end);

    /**
     * 获取有序集合指定分数范围的元素
     *
     * @param key      键
     * @param minScore 最小分数
     * @param maxScore 最大分数
     * @return 元素集合
     */
    Set<String> zsetRangeByScore(String key, double minScore, double maxScore);

    /**
     * 获取元素在有序集合中的分数
     *
     * @param key   键
     * @param value 值
     * @return 分数
     */
    Double zsetScore(String key, String value);

    /**
     * 获取有序集合大小
     *
     * @param key 键
     * @return 集合大小
     */
    Long zsetSize(String key);
    
    /**
     * 获取Hash类型数据
     *
     * @param key 键
     * @return Hash数据
     */
    Map<String, String> getHash(String key);
    
    /**
     * 获取List类型数据
     *
     * @param key 键
     * @return List数据
     */
    List<String> getList(String key);
    
    /**
     * 获取Set类型数据
     *
     * @param key 键
     * @return Set数据
     */
    Set<String> getSet(String key);
    
    /**
     * 获取ZSet类型数据
     *
     * @param key 键
     * @return ZSet数据
     */
    Set<String> getZSet(String key);
}